#pragma once
#include <string>
#include <array>
#include "sqlite3.h"
#include <cmath>
#include <vector>
#include <opencv2/opencv.hpp>
#include"json.hpp"
#include <utility> // 包含 std::pair 的头文件

class ChessDatabase {
public:
	struct ChessPiece {
		int num;                    // 主键
		double x;                   // X坐标
		double y;                   // Y坐标
		std::string color;          // 颜色
		std::string type;           // 类型
		std::array<double, 7> huMoments;    // Hu矩
		double area;                // 轮廓面积
		double perimeter;           // 轮廓周长
		double aspectRatio;         // 宽高比
	   // std::vector<double> projHist;       // 垂直投影直方图
		std::array<double, 3> zoneDensity;  // 区域密度
		// SIFT 特征（直接存储关键点和描述子）
		std::vector<cv::KeyPoint> siftKeypoints; // 关键点集合
		cv::Mat siftDescriptors;                 // 描述子矩阵（每行是一个描述子）
	};

    explicit ChessDatabase(const std::string& db_path);
    ~ChessDatabase();

    void addChessPiece(const ChessPiece& piece);
    void printAllChessPieces();
    //std::string matchChessPiece(const ChessPiece& piece);

private:
    sqlite3* db;
    void create_table();
	    // 添加静态序列化/反序列化函数声明
    static nlohmann::json serializeKeypoints(const std::vector<cv::KeyPoint>& keypoints);
    static nlohmann::json serializeDescriptors(const cv::Mat& descriptors);
    static std::vector<cv::KeyPoint> deserializeKeypoints(const nlohmann::json& j);
    static cv::Mat deserializeDescriptors(const nlohmann::json& j);
	
	
};

